package com.zbl.service;

import com.xuxueli.crawler.XxlCrawler;
import com.xuxueli.crawler.loader.strategy.HtmlUnitPageLoader;
import com.xuxueli.crawler.parser.PageParser;
import com.zbl.vo.WrapperRequestParam;
import lombok.AllArgsConstructor;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

/**
 * @Author: zhangjun
 * @Date: 2020/7/23 17:12
 * @Description: 爬虫 服务层
 */
@Service
@AllArgsConstructor
public class UnLoginCrawlerService {
    private ApplicationContext applicationContext;

    public void spider(WrapperRequestParam param) throws ClassNotFoundException {

        /**
         * 使用Java通过反射获取对象MeiJuMiPageParser，没有受到spring容器的管理 所以无法注入需要使用的类，需要使用下面spring的方式，也就是直接从容器中取得这个要反射生成的类
         * Class t =Class.forName(param.getPageParser());
         *          Object o = t.newInstance();
         */
        // 获取class对象
        Class<?> cls = Class.forName(param.getPageParser());
        // 获取spring中的bean对象
        Object bean = applicationContext.getBean(cls);

        // 构造爬虫
        XxlCrawler crawler = new XxlCrawler.Builder()
                .setUrls(param.getUrl()) //待爬的URL列表 参数为String ..."https://www.meijumi.net/100.html"
                .setWhiteUrlRegexs(param.getWhiteUrlRegexs()) //URL白名单正则，非空时进行URL白名单过滤页面ss "https://www.meijumi.net/\\d+\\.html"
                .setAllowSpread(param.isAllowSpread()) // 允许扩散爬取，将会以现有URL为起点扩散爬取整站 默认是true
                .setIfPost(param.isIfPost()) //请求方式：true=POST请求、false=GET请求、 默认是false
                .setParamMap(param.getParamMap()) //请求参数
                .setHeaderMap(param.getHeaderMap()) // 请求Header
                .setThreadCount(1)//并发线程数
                .setPageLoader(new HtmlUnitPageLoader()) //加载方式 JsoupPageLoader 、HtmlUnitPageLoader、SeleniumPhantomjsPageLoader 默认使用HtmlUnitPageLoader
                .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36")        // HtmlUnit 版本 PageLoader：支持 JS 渲染
                .setPageParser((PageParser) bean)
                .build();
        // 启动
        crawler.start(true);
    }
}
